<template>
    <h4>{{person}}</h4>
    <h2>姓名：{{name}}</h2>
    <h2>年龄：{{age}}</h2>
    <h2>薪资：{{job.j1.salary}}K</h2>
    <h2>车辆信息:{{person.car}}</h2>
    <button @click="name+='~'">修改姓名</button>
    <button @click="age++">增长年龄</button>
    <button @click="job.j1.salary++">涨薪</button>
    <button @click="test">点我查看原始对象</button>
    <button @click="addCar">添加一辆车</button>
    <button @click="person.car.name+='~'">markraw 修改车名</button>
</template>

<script>
    //     - toRaw：
    //   - 作用：将一个由```reactive```生成的<strong style="color:orange">响应式对象</strong>转为<strong style="color:orange">普通对象</strong>。
    //   - 使用场景：用于读取响应式对象对应的普通对象，对这个普通对象的所有操作，不会引起页面更新。
    // - markRaw：
    //   - 作用：标记一个对象，使其永远不会再成为响应式对象。
    //   - 应用场景:
    //     1. 有些值不应被设置为响应式的，例如复杂的第三方类库等。
    //     2. 当渲染具有不可变数据源的大列表时，跳过响应式转换可以提高性能。
    import { ref, reactive, toRef, toRefs, toRaw, markRaw, readonly } from 'vue'
    //引用对象
    export default {

        setup() {
            let person = reactive({
                name: '张三',
                age: 18,
                job: {
                    j1: {
                        salary: 20
                    }
                }
            })
            function test() {
                const p = toRaw(person);
                // 作用：将一个由```reactive```生成的<strong style="color:orange">响应式对象</strong>转为<strong style="color:orange">普通对象</strong>。
                p.age++
                console.log(p);
            }
            function addCar() {
                // ：标记一个对象，使其永远不会再成为响应式对象。
                let car = { name: 'xiaomi', price: 1999 }
                person.car = readonly(car)
                //此对象不能被修改
            }
            return {
                person,
                test,
                addCar,
                ...toRefs(person)
            }
        }

    }

</script>

<style>

</style>